/**
 * Clasa Putere se refera la functia putere. Aceasta este de forma f(x)=x^n.
 * Derivata aceste functii este f'(x)=n*x^(n-1) 
 */

package q10.Functii.FunctiiElementare;

import q10.Operatori.Produs;
import q10.Functii.Functie;

public class Putere extends Functie {

	/**Metoda calcul apeleaza metoda Calcul si returneaza valoarea functiei x^n
	 * In cazul in care unul din cei doi membrii ai arborelui este null, rezulta eroare.
	 * @return double
	 */
	public double calcul() {
		// TODO Auto-generated method stub
		if ((fStang == null) || (fDrept == null))
            System.exit(1);

        return Calcul(fStang.calcul(),fDrept.calcul());
	}
	
	/**Metoda Calcul cu doi parametrii intoarce valoarea functiei putere.
	 * 
	 * @param aux1 	valoarea lui x (x^n)
	 * @param aux2	valoarea lui n (x^n)
	 * @return double
	 */
	public static double Calcul(double aux1, double aux2)
    {
        return Math.pow(aux1, aux2);
    }

	/**Metoda calculDerivata returneaza valoarea calcului derivatei functiei putere. Aceasta metoda
	 * apeleaza metoda Calcul din clasa Produs.
	 * @return double
	 */
	public double calculDerivata() {
		// TODO Auto-generated method stub
		if (fStang == null)
            System.exit(1);

        return Produs.Calcul(Calcul(fStang.calculDerivata(),fDrept.calculDerivata()),
                Ln.Calcul(fStang.calcul()));
	}

	/**Metoda derivare() returneaza String-ul rezultat din derivarea functiei putere.
	 * Apeleaza metoda concatTermens() din clasa Produs.
	 * @return String
	 */
	public String derivare() {
		// TODO Auto-generated method stub
		if (fStang == null)
            System.exit(1);

        return Produs.concatTermens(concatTermeni(fStang.derivare(),fDrept.derivare()),
                                      Ln.concatTermeni(fStang.toString()));
	}
	
	/**Metoda toString() afiseaza functia putere ca si un String;
	 * @return String
	 */
	public String toString() {
		// TODO Auto-generated method stub
		if (fStang == null)
            System.exit(1);

        return concatTermeni(fStang.toString(), fDrept.toString());
	}
	/**Metodat concatTermeni concateneaz termenii functiei pentru a putea fi afisati ca String
	 * 
	 * @param aux1	parametrul x din x^n
	 * @param aux2	parametrul n din x^n
	 * @return String
	 */
	public static String concatTermeni(String aux1, String aux2)
    {
        String aux;
        int nrP;

        nrP = aux1.charAt(0) == '^' ? 0 : 2;

        aux = "";
        if (nrP != 0) aux += aux1;
        aux += "^" ;
        if (nrP != 0) aux += aux2;

        return aux;
    }

}
